// 文件名：unordered_map_hash_join.cpp
// 目的：演示哈希连接（hash join）：用顾客表构建哈希索引，再将订单表按 customerId 连接输出。
// 数据：
//   - customers：{id, name}；orders：{customerId, item}；
// 步骤：
//   1) 以 customers 建立 unordered_map<int,string>（id -> name），预留容量减少扩容；
//   2) 扫描 orders：对每条订单按 customerId 查找，命中则输出“姓名 + 订单项”，未命中输出 unknown；
// 优势：
//   - 构建与查找均摊 O(1)，适合大数据下的连接操作（相较于嵌套循环 O(N*M) 大幅优化）。
// 注意：
//   - 数据可能存在“脏外键”（订单中的 customerId 不存在于客户表），需妥善处理。

#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>

struct Order {
    int customerId;
    std::string item;
};

struct Customer {
    int id;
    std::string name;
};

int main() {
    std::vector<Customer> customers = {
        {1, "Alice"}, {2, "Bob"}, {3, "Claire"}
    };
    std::vector<Order> orders = {
        {1, "Book"}, {2, "Pen"}, {1, "Lamp"}, {4, "Tablet"}
    };

    // 构建哈希索引：客户ID -> 客户名
    std::unordered_map<int, std::string> lookup;
    lookup.reserve(customers.size());
    for (const auto& c : customers) {
        lookup.emplace(c.id, c.name);
    }

    // 连接输出
    std::cout << "Hash join result:\n";
    for (const auto& order : orders) {
        if (auto it = lookup.find(order.customerId); it != lookup.end()) {
            std::cout << "  " << it->second << " ordered " << order.item << '\n';
        } else {
            std::cout << "  <unknown customer #" << order.customerId
                      << "> ordered " << order.item << '\n';
        }
    }

    return 0;
}